package com.ruoyi.service.production.impl;

import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.domain.production.MesProductionReturn;
import com.ruoyi.domain.production.MesProductionReturnDetail;
import com.ruoyi.mapper.production.MesProductionReturnMapper;
import com.ruoyi.mapper.production.MesProductionReturnDetailMapper;
import com.ruoyi.service.production.IMesProductionReturnService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 生产退料单Service业务层处理
 * 
 * @author ruoyi
 */
@Service
public class MesProductionReturnServiceImpl implements IMesProductionReturnService
{
    @Autowired
    private MesProductionReturnMapper mesProductionReturnMapper;

    @Autowired
    private MesProductionReturnDetailMapper mesProductionReturnDetailMapper;

    /**
     * 查询生产退料单
     * 
     * @param returnId 生产退料单主键
     * @return 生产退料单
     */
    @Override
    public MesProductionReturn selectMesProductionReturnByReturnId(Long returnId)
    {
        MesProductionReturn returnOrder = mesProductionReturnMapper.selectMesProductionReturnByReturnId(returnId);
        if (returnOrder != null) {
            // 查询明细列表
            List<MesProductionReturnDetail> detailList = mesProductionReturnDetailMapper.selectDetailListByReturnId(returnId);
            returnOrder.setReturnDetailList(detailList);
        }
        return returnOrder;
    }

    /**
     * 查询生产退料单列表
     * 
     * @param mesProductionReturn 生产退料单
     * @return 生产退料单
     */
    @Override
    public List<MesProductionReturn> selectMesProductionReturnList(MesProductionReturn mesProductionReturn)
    {
        return mesProductionReturnMapper.selectMesProductionReturnList(mesProductionReturn);
    }

    /**
     * 校验退料单编号是否唯一
     * 
     * @param returnCode 退料单编号
     * @param returnId 退料单ID
     * @return 结果
     */
    @Override
    public boolean checkReturnCodeUnique(String returnCode, Long returnId)
    {
        if (StringUtils.isEmpty(returnCode))
        {
            return false;
        }
        MesProductionReturn returnOrder = mesProductionReturnMapper.checkReturnCodeUnique(returnCode, returnId);
        return returnOrder == null;
    }

    /**
     * 根据工单ID查询退料单列表
     * 
     * @param workOrderId 工单ID
     * @return 退料单集合
     */
    @Override
    public List<MesProductionReturn> selectReturnListByWorkOrderId(Long workOrderId)
    {
        return mesProductionReturnMapper.selectReturnListByWorkOrderId(workOrderId);
    }

    /**
     * 根据领料单ID查询退料单列表
     * 
     * @param pickingId 领料单ID
     * @return 退料单集合
     */
    @Override
    public List<MesProductionReturn> selectReturnListByPickingId(Long pickingId)
    {
        return mesProductionReturnMapper.selectReturnListByPickingId(pickingId);
    }

    /**
     * 根据仓库ID查询退料单列表
     * 
     * @param warehouseId 仓库ID
     * @return 退料单集合
     */
    @Override
    public List<MesProductionReturn> selectReturnListByWarehouseId(Long warehouseId)
    {
        return mesProductionReturnMapper.selectReturnListByWarehouseId(warehouseId);
    }

    /**
     * 新增生产退料单
     * 
     * @param mesProductionReturn 生产退料单
     * @return 结果
     */
    @Override
    @Transactional
    public int insertMesProductionReturn(MesProductionReturn mesProductionReturn)
    {
        int result = mesProductionReturnMapper.insertMesProductionReturn(mesProductionReturn);
        // 新增明细
        if (mesProductionReturn.getReturnDetailList() != null && !mesProductionReturn.getReturnDetailList().isEmpty()) {
            for (MesProductionReturnDetail detail : mesProductionReturn.getReturnDetailList()) {
                detail.setReturnId(mesProductionReturn.getReturnId());
                mesProductionReturnDetailMapper.insertMesProductionReturnDetail(detail);
            }
        }
        return result;
    }

    /**
     * 修改生产退料单
     * 
     * @param mesProductionReturn 生产退料单
     * @return 结果
     */
    @Override
    @Transactional
    public int updateMesProductionReturn(MesProductionReturn mesProductionReturn)
    {
        // 删除原有明细
        mesProductionReturnDetailMapper.deleteMesProductionReturnDetailByReturnId(mesProductionReturn.getReturnId());
        
        // 新增明细
        if (mesProductionReturn.getReturnDetailList() != null && !mesProductionReturn.getReturnDetailList().isEmpty()) {
            for (MesProductionReturnDetail detail : mesProductionReturn.getReturnDetailList()) {
                detail.setReturnId(mesProductionReturn.getReturnId());
                mesProductionReturnDetailMapper.insertMesProductionReturnDetail(detail);
            }
        }
        
        return mesProductionReturnMapper.updateMesProductionReturn(mesProductionReturn);
    }

    /**
     * 批量删除生产退料单
     * 
     * @param returnIds 需要删除的生产退料单主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteMesProductionReturnByReturnIds(Long[] returnIds)
    {
        // 删除明细
        for (Long returnId : returnIds) {
            mesProductionReturnDetailMapper.deleteMesProductionReturnDetailByReturnId(returnId);
        }
        return mesProductionReturnMapper.deleteMesProductionReturnByReturnIds(returnIds);
    }

    /**
     * 删除生产退料单信息
     * 
     * @param returnId 生产退料单主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteMesProductionReturnByReturnId(Long returnId)
    {
        // 删除明细
        mesProductionReturnDetailMapper.deleteMesProductionReturnDetailByReturnId(returnId);
        return mesProductionReturnMapper.deleteMesProductionReturnByReturnId(returnId);
    }

    /**
     * 审核生产退料单
     * 
     * @param returnId 退料单ID
     * @param status 审核状态
     * @return 结果
     */
    @Override
    public int auditMesProductionReturn(Long returnId, String status)
    {
        MesProductionReturn returnOrder = new MesProductionReturn();
        returnOrder.setReturnId(returnId);
        returnOrder.setStatus(status);
        return mesProductionReturnMapper.updateMesProductionReturn(returnOrder);
    }

    /**
     * 执行生产退料
     * 
     * @param returnId 退料单ID
     * @return 结果
     */
    @Override
    @Transactional
    public int executeMesProductionReturn(Long returnId)
    {
        // 更新退料单状态为已执行
        MesProductionReturn returnOrder = new MesProductionReturn();
        returnOrder.setReturnId(returnId);
        returnOrder.setStatus("3"); // 已执行
        
        // TODO: 这里可以添加库存增加逻辑
        // 1. 查询退料明细
        // 2. 增加库存
        // 3. 生成库存流水记录
        
        return mesProductionReturnMapper.updateMesProductionReturn(returnOrder);
    }
}